free_software_licenses

An Operating System Family Tree

# 免费发行版

  • Debian GNU/Linux ,是一个操作系统及自由软件的发行版,由一群自愿付出时间和精力的用户来维护并更新。它附带了超过 59000 个软件包,这些预先编译好的软件被打包成一种良好的格式以便于用户安装和使用。
  • Ubuntu,是一款基于 Debian Linux 的以桌面应用为主的操作系统,内容涵盖文字处理、电子邮件、软件开发工具和 Web 服务等,可供用户免费下载、使用和分享。
  • CentOS,是基于 Red Hat Enterprise Linux(RHEL)提供的可自由使用源代码的企业级 Linux 发行版本;是一个稳定,可预测,可管理和可复制的免费企业级计算平台。

# Linux 管理

Linux目录结构

写代码怎能不会这些Linux命令?

# 常用快捷键

Ctrl + l:清除屏幕信息
Ctrl + C:中断正在运行的程序
Shift + Insert:粘贴
Tab:命令和文件名补全

# 常用的一些命令

  • pwd:显示当前所在的目录
  • ls:显示当前目录的文件和目录
  • ls -l 或 ll:显示当前目录的文件和目录的详细信息,包括文件类型(文件 -、目录 d、链接 l)、权限、连接的文件数、属主、属组、文件大小(字节)、最后修改日期、文件名,如 drwxr-xr-x. 13 root root 155 Aug 22 2019 usr
  • ls -a:显示当前目录的文件和目录,包括隐藏文件和目录
  • ls -al:多个选项合并使用
  • cd /:跳转到根目录
  • cd ~:跳转到当前用户的家目录
  • cd -:切换到上次进入的目录
  • cd abc/test:使用相对路径的方式切换到 abc/text 目录
  • cd /abc/test:使用绝对路径的方式切换到 abc/text 目录
  • clear:清除屏幕信息
  • ifconfig:查看系统的 IP 地址
  • df:显示磁盘的使用情况
  • df -k -h:格式化显示输出磁盘使用情况,-k 指定区块大小为 1024 字节
  • du 目录名称:显示指定目录下面的子目录的目录大小和当前目录的总的大小
  • du -sh *:显示当前目录下每个文件/子目录的大小,-s 仅显示总计
  • du -sh 目录名称:显示指定目录的总的大小
  • du -h --max-depth=1 目录名称:查看该目录下各文件夹的大小
  • date -R 或 date +"%Y-%m-%d %H:%M:%S" 或 timedatectl:查看当前时间
  • ntpdate ntp1.aliyun.com:同步阿里云北京时间
  • hwclock -r:查看系统硬件时钟
  • hwclock -w:从当前系统时间设置硬件时钟
  • env:查看当前用户的变量
  • echo:输出
  • history:显示执行过的历史命令记录
  • which nginx:查找给定命令的绝对路径
  • whereis nginx:查找给定命令的二进制文件(-b)、man 说明文件(-m)和源代码文件(-s)的路径
  • man:查看指令帮助
  • init 0:关机
  • init 6:重启,或 reboot
  • su 用户名:切换登录用户,退回普通账户时可执行“exit”或“logout”
  • sudo:以其它身份来执行命令,预设的身份为 root
  • sudo -i:相当于使用 root 超级用户重新登录 shell,提示输入密码时使用的是当前用户的密码,该命令会重新加载 /etc/profile 文件以及 /etc/bashrc 文件等系统配置文件,并且还会重新加载 root 用户的 shell 环境变量所对应的配置文件,执行后是完全的 root 用户的环境,且没有时间限制
  • who:显示目前登录系统的用户信息
  • last:显示最近登入系统的用户相关信息
  • lastb:显示用户错误的登录列表,-n<显示列数> 或 -<显示列数> 设置列出名单的显示列数
  • lastlog:显示系统中所有用户最近一次登录信息
  • cat /etc/passwd:查看用户列表,/etc/passwd 文件将每个用户的详细信息写为一行,其中包含:用户名、密码(x 表示加密密码保存在 /etc/shadow 文件中)、用户 ID、群组 ID、用户信息、用户的家目录、用户使用的 shell 类型
  • groupadd nginxgroup:创建工作组
  • useradd -g nginxgroup nginx:创建系统用户,-g 指定用户所属的群组
  • userdel -r nginx:-r 表示将用户及用户的主目录删掉
  • passwd:修改用户密码
  • chpasswd:批量修改用户密码,通过把一个文件内容重新定向添加到 /etc/shadow 中
  • setup:启动图形化操作界面
  • uname -a:显示系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)
  • hostnamectl set-hostname xxx:修改主机名
  • hostnamectl set-hostname "" 或 hostnamectl set-hostname "" --static 或 hostnamectl set-hostname "" --pretty:删除主机名
  • watch:以周期性的方式执行给定的指令,如 watch -n 1 'ps -aux --sort -pmem,-pcpu'
  • wget -qO- bench.sh | bash:查看系统信息,测试网络带宽及硬盘读写速率
  • ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.237:把 ssh 公钥文件安装到远程主机对应的账户下
  • ssh -i ~/.ssh/id_rsa -p 22 root@192.168.1.237:使用 ssh 远程登录服务器

# Systemd

Systemd 是 Linux 系统工具,用来启动守护进程,是一组命令

Systemd架构图

# systemctl 命令

  • systemctl是 Systemd 的主命令,监视和控制 Systemd,可用于查看系统状态和管理系统及服务(实际上将 service 和 chkconfig 这两个命令组合到一起)

  • Unit:表示不同类型的 Systemd 对象,通过配置文件进行标识和配置,文件中主要包含了系统服务,监听 socket、保存的系统快照以及其他与 init 相关的信息(使用 systemctl 控制单元时,通常需要使用单元文件的全名,包括扩展名,如果无扩展名,systemctl 默认把扩展名当做 .service)

  • 配置文件 /usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的 /etc/initd.d
    /run/system/system:系统执行过程中所产生的服务脚本,比上面的目录优先运行
    /etc/system/system:管理员建立的执行脚本,类似于 /etc/rc.d/rcN.d/Sxx 类的功能,比上面目录优先运行,在三者之中,此目录优先级最高

  • 例子
    systemctl start firewalld.service:启动某服务
    systemctl stop firewalld.service:停止某服务
    systemctl restart firewalld.service:重启某服务
    systemctl reload sshd.service:重新加载服务的配置
    systemctl try-restart firewalld.service:条件式某服务(已启动才重启,否则不做任何操作)
    systemctl status firewalld.service:检查服务状态
    systemctl enable firewalld.service:设置某服务开机自启动(相当于在 /etc/systemd/system 目录添加一个符号链接,指向 /usr/lib/systemd/system 里面的 firewalld.service 文件)
    systemctl is-enabled firewalld.servcice:查看某服务是否开机自启
    systemctl disable firewalld.service:停止某服务开机自启动
    systemctl cat firewalld.service:可以查看某服务配置文件的内容
    systemctl list-units -t service:查看所有已启动的服务
    systemctl kill 进程名:杀死进程
    systemctl halt systemctl poweroff:关机
    systemctl reboot:重启
    systemctl suspend:挂起
    systemctl hibernate:休眠
    systemctl hybrid-sleep:休眠并挂起
    systemctl daemon-reload:重新加载服务配置文件(/usr/lib/systemd/system/)

# 其它命令

  • systemd-analyze 命令用于查看启动耗时
  • hostnamectl 命令用于查看当前主机的信息
  • localectl 命令用于查看本地化设置
  • timedatectl 命令用于查看当前时区设置
  • loginctl 命令用于查看当前登录的用户
  • journalctl 命令用于查看 Unit 的启动日志(内核日志和应用日志)
    • 常用选项:-n10 显示尾部的最新10行日志;-f 实时滚动显示最新日志;-u 查看某个 Unit 的日志;--no-pager 改为正常的标准输出(默认分页输出)
    • 如:journalctl -f -u nginx.service

# 权限

  • 权限:定义计算机资源或者服务的访问能力,常见的操作权限有:r 可读取、w 可写入、x 可执行等
  • 定义一个资源的权限:① 用户具有该资源的权限(文件所有者,属主);② 用户组具有该资源的权限(属组);③ 其他用户(既不是属主,也不是属组)
  • chmod:用于修改文件的权限 chmod [-cfvR] mode file
    • mode:权限设定字串,格式 [ugoa...][[+-=][rwxX]...][,...]
      • 4 r--、5 r-x、6 rw-、7 rwx(4+2+1)
      • u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是
      • + 表示增加权限、- 表示取消权限、= 表示唯一设定权限
      • r 表示可读取(数字代号为 4),w 表示可写入(数字代号为 2),x 表示可执行(数字代号为 1),X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行
    • -R:递归改变整个目录的所有文件权限
    • chmod 777 file 相当于 chmod a=rwx filechmod 771 file 相当于 chmod ug=rwx,o=x filechmod +x xxx.shchmod -R a+r *(将当前目录下的所有文件与子目录皆设为任何人可读取)
  • chown:用于修改文件的属主或属组 chown [-cfhvR] user[:group] file...

# Vi 编辑器

  • 3 种基本工作模式 编辑模式(命令模式):所有的机键动作都会理解为编辑整个文档的操作,默认为编辑模式
    输入模式(插入模式):大部分机键动作都会理解为输入的字符(在命令模式下按 i 或 o 进入)
    末行模式:在末行模式,输入很多文件管理命令用于离开或者保存文件(在命令模式下按 : 进入)
    可视模式:编辑模式下,按 v 可以进入可视模式,在可视模式下,移动光标可以选择文本;按 V 进入可视行模式,总是整行整行地选中;Ctrl + v 进入可视块模式

Vim's_modes

  • 退出 vi
    命令模式下保存并退出:输入 ZZ
    命令模式下不保存,强制退出:输入 ZQ
    :w [filename] 将文章以指定的文件名 filename 保存
    :wq 存盘并退出 vi
    :x 执行保存并退出 vi
    :q! 不存盘强制退出 vi

  • 编辑模式
    b:移动光标到前一个单词开头
    w:移动光标到后一个单词开头
    0:跳转到行首
    $:跳转到行尾
    G:跳转到最后一行
    gg:跳转到第一行
    x:删除光标后 1 个字符(3x 表示删除光标后 3 个字符) X:删除光标前 1 个字符 d + 上下左右:删除 1 个字符
    dw:删除光标后的 1 个单词(3dw 表示删除光标后 3 个单词)
    daw:删除光标所在单词
    dd:删除光标所在行(3dd 表示从光标行开始删除 3 行)
    d$:删除光标到行尾的内容
    y + 上下左右:复制 1 个字符
    yy:复制光标所在行(3yy 表示从光标行开始复制 3 行)
    p:粘贴
    n:下一个匹配的字符串
    N:上一个匹配的字符串
    u:撤销上一步的操作
    Ctrl + r:恢复上一步被撤销的操作
    Ctrl + f:向下翻一页
    Ctrl + b:向上翻一页

  • 末行模式
    :set nu:显示行号
    :3:跳转到第 3 行
    :1, 4d:删除第一行到第四行
    :/parttern:从前往后查找 parttern
    :?parttern:从后往前查找 parttern
    :%s/partter/string/gi:替换 partter 为 string(g 全局替换,i 忽略大小写)

  • 使用可视块模式进行多行插入或替换:进入可视块模式后,选中块,输入 I 进入插入模式(或输入 c change删除选中的内容后进入插入模式),输入要插入字符后,按 ESC 完成多行插入

  • 从编辑模式进入插入模式
    i:在光标所在字符前开始插入
    a:在光标所在字符后开始插入
    o:在光标所在行的下面另起一新行插入
    s:删除光标所在的字符并开始插入
    I:在光标所在行的行首开始插入(如果行首有空格则在空格之后插入)
    A:在光标所在你行的行尾开始插入
    O:在光标所在行的上面另起一行开始插入
    S:删除光标所在行并开始插入

Vim常用命令

Vim键盘图

# 文件管理

# 文件搜索和查看

find 用来在指定目录下查找子目录与文件(用 . 来表示当前目录,用 / 来表示系统根目录),-name 指定目录 'test*'(从指定目录下查找指定文件名,可以用 * 通配符),find -mtime +30(更改时间在 30 天之前的文件),find -mmin +1(更改时间在 1 分钟前的文件)
cat file:查看文件内容
cat > filen:可以快速创建文件并写入内容
less 或 more:less 输入 /pattern 可以查找内容,more 翻页比较方便
tail -100f file:显示指定文件的末尾 100 行(默认 10),带 f 可以实时更新
head -100 file:显示指定文件的开头 100 行(默认 10) sed -n '1000,3000p' file:显示 1000 到 3000 行的内容

# 创建文件和目录

touch 文件名
vi 文件名
mkdir -p 目录名 1/目录名 2:创建层级目录,可以是相对目录,也可以是绝对目录

# 文件的压缩和解压

  • tar 命令,常用选项:
    -z :使用 gzip,文件后缀名 .tar.gz
    -j :使用 bzip2,文件后缀名 .tar.bz2
    -J :使用 xz,文件后缀名 .tar.xz
    -c :新建打包文件,文件后缀名 .tar
    -t :查看打包文件里面有哪些文件
    -x :解打包或解压缩的功能
    -v :显示执行时的详细信息
    -f 文件:指定要处理的文件
    -C 目录:在特定目录解压缩
  • zip 命令,压缩 .zip 文件,常用选项:
    -q:不显示指令执行过程
    -r:递归处理,将指定目录下的所有文件和子目录一并处理
    -e:交互设置密码
    -P:直接设置密码
  • unzip 命令,解压缩 .zip 文件,常用选项:
    -l:显示压缩文件内所包含的文件,但不解压
    -p:显示将解压缩的结果
    -v:显示执行时的详细信息
    -n:解压缩时不要覆盖原有的文件
    -d 目录:指定文件解压缩后所要存储的目录
    -P:直接设置解压密码
  • gzip:用来压缩或解压缩文件(注意:不会保留原来的文件)
tar -cvf test.tar test    # 仅打包,不压缩
tar -xvf test.tar -C test # 解压到 test 目录
tar -tvf test.tar         # 查看,但不解压

tar -zcvf test.tar.gz test    # 打包后,以 gzip 压缩
tar -zcvf /root.tar.gz .[!.]* * # 打包当前文件,包括隐藏文件,排除 . 和 … 目录
tar -zxvf test.tar.gz -C test # 解压
tar -zxvf root.tar.gz docker-data/ # 解压某个指定的目录

zip -r test.zip test
unzip test.zip -d test
1
2
3
4
5
6
7
8
9
10
11

# 文件的删除

rm 文件名
rm -f 文件名
rm -fr 目录:删除目录必须使用 -r 递归删除,-f 表示强制删除,rm -fr .*(删除当前目录下的所有隐藏文件)

# 文件的拷贝和移动

cp 文件名 目标路径:拷贝
mv 文件名 目标路径:移动
scp local_file user@remote_ip:remote_dir_file:Linux 之间复制文件和目录,-r 递归复制整个目录

# 文本处理

  • grep 命令:grep [-abcEFGhHilLnqrsvVwxy] [-A <显示列数>] [-B <显示列数>] [-C <显示列数>] [-d <进行动作>] [-e <模式>] [-v <不包含匹配文本>] [-f <范本文件>] [--help] [模式] [文件或目录...]

    • 查找文件中包含指定内容的所有行,-n(显示行数),-C 2(显示查询出来的内容的上下 2 行),-A 2(显示下 2 行),-B 2(显示上 2 行),-v(显示不包含匹配文本的所有行)
  • sed 命令:sed [-hnV] [-e <script>] [-f <script文件>] [文本文件]

    • 利用脚本来处理、编辑文本文件
    • 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等
    • 一种流编辑器,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出
    • sed 可以将任何字符用作分隔符,因此应使用未出现在替换字符串中的字符作为分隔符,如 sed -e"s@pattern@$replacement@g"
  • awk 命令:awk [选项参数] 'script' var=value file(s)awk [选项参数] -f scriptfile var=value file(s)

    • AWK 是一种处理文本文件的语言,也是一个强大的文本分析工具,用于对文本和数据进行处理
    • 数据可以来自标准输入、一个或多个文件,或其它命令的输出
    • 支持用户自定义函数和动态正则表达式等先进功能

# 网络通讯

ifconfig:ip 查看
lsof -i:80:查看 80 端口的占用情况
systemctl restart network:重启网络服务
nslookup www.google.com:查询域名 DNS 信息
netstat -nap | grep 9836:查看端口、进程的相关信息(-n 直接使用 ip 地址;-a 显示所有连线中的 Socket;-p 显示正在使用 Socket 的程序识别码和程序名称;-t 显示 TCP 传输协议的连线状况;-u 显示 UDP 传输协议的连线状况)
netstat -tunlp | grep 80:查看占用 80 端口的进程(Windows 下使用 netstat -ano|findstr 80)
dhclient:动态获取 IP 地址
dhclient -r:释放 IP 地址

# 防火墙

service network restart:重启网络服务
chkconfig iptables on:开启防火墙(重启后生效)
chkconfig iptables off:关闭防火墙(重启后生效)
service iptables restart:重启防火墙

systemctl status firewalld 或 firewall-cmd --state:查看防火墙状态
systemctl restart firewalld 或 firewall-cmd --reload:重启防火墙服务

firewall-cmd --add-port=8080/tcp --zone=public --permanent:永久打开 8080 端口,需要重启防火墙服务或 reload 后才生效
firewall-cmd --remove-port=3306/tcp:阻止通过 tcp 访问 3306 firewall-cmd --reload:更新防火墙规则
firewall-cmd --list-ports:查看所有打开的端口
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080:将 80 端口的流量转发至 8080
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080:将 80 端口的流量转发至 192.168.0.1 的 8080 端口

# 系统管理

top命令

top:实时显示系统资源使用情况及进程信息,输入 M 按照内存排序,输入 E 切换内存的显示单位,输入 P 按照 CPU 排序(默认),输入 T 按照占用 CPU 的时间排序
top -Hp 1:查看某个进程的线程信息(-H:显示线程信息,-p:指定 pid)
free -h:查看内存使用情况
vmstat:查看虚拟内存状态,vmstat 1 指定状态信息刷新的时间间隔为 1s
iotop
ps -ef | grep java:进程状态查看(Windows 下使用 tasklist|findstr {pid})
lsof -a -p 3008:查看已打开的所有文件,-a 表示查询条件都满足,默认是 -o
ll /proc/{pid}: 查看进程相关信息
killall java:使用进程的名称来杀死一组进程
kill -15 {pid}:终止某个进程,发送程序结束信号(SIGTERM)到指定程序,与 SIGKILL 不同的是该信号可以被阻塞和处理(通常用来要求程序自己正常退出)

  • ps 命令,当前系统的进程状态,如 ps -ef | grep javaps -aux | grep java,常用选项:
    -a:显示现行终端机下的所有程序,包括其他用户的程序
    -u:以用户的格式来显示程序状况
    -x:显示所有程序,不以终端机来区分
    -e:显示所有程序
    -f:显示 UID, PPIP, C 与 STIME 栏位

# 常用的配置文件

  • /etc/profile:环境变量配置文件
  • /etc/sysconfig/iptables:防火墙的相关配置
  • /etc/sysconfig/network-scripts/ifcfg-eth0:网卡配置文件
  • /etc/inittab:系统运行级别配置文件
  • /etc/rc.d/rc.local:配置系统开机启动相关命令

# bash shell

  • bash 是 Bourne Again Shell 简称,是从 unx 系统中的 sh 发展而来,是用户和 Linux 內核交互的工具,用户通过 bash 操作内核完成系统的使用和管理
  • 多个指令执行的判断方法
    bash1&&bash2:前者执行成功才会执行后者
    bash1||bash2:前者执行完毕且失败才执行后者
  • source [文件名]:在当前 shell 环境中从指定文件读取和执行命令,如 source /etc/profile

# 变量

  • 变量是代表一些值的符号
  • Linux 有自定义变量(local)和环境变量(environment),自定义变量和环境变量作用范围不同:自定义变量只能在当前的 shell 环境中有效;环境变量会在整个主机下的 shell 环境中生效
  • 可以使用以下指令查看所有变量:set 可以查看所有变量;env 只能查看环境变量

# 变量设值方式

  1. 通过自定义变量设置

    • VARIABLE=vaue 定义变量(变量值如果有空格,必须使用双引号或者单引号,单引号内不允许使用 $ 引用变量
    • $VARIABLE 获取变量值
    • unset VARNAME 删除已定义的环境变量或本地变量
    • 变量名不能以数字或者特殊字符开头
    • 命令替换:由反引号括起来的是一条命令,shell 先执行该命令,然后将输出结果立即替换到当前命令行来,命令行替换也可以用 $() 表示,如 DATE=`date +%Y%m%d`DATE=$(date +%Y%m%d)
    • 单引号用于保持引号内的所有字符的字面值,即使引号内的双引号, 反斜杠 和回车也不例外
    • 使用双引号保持引号内的所有字符的字面值(回车也不例外),但以下情况除外:
      • 反引号用于命令替换
      • \$ 用于表示 $
      • \` 用于表示反引号
      • \" 用于表示内嵌的双引号
      • \\ 用于表示反斜杠 \
      • 反斜杠用于非以上的情况,仅表示反斜杠
      • 对变量的取值 $EXAMPLE
  2. 通过别名(Aliases)设置

    • alias Iss='ls -la'
    • 使用 alias 自身查看所有的 alias
    • 使用 alias 和 alias 名称查看 alias 值
    • unalias 删除别名定义
  3. 通过环境变量设置:export [variable name],如 export PATH=$PATH:/opt/build_tools/bin(Linux 下用冒号“:”来分隔路径) export ALL_PROXY=socks5://192.168.192.1:10808 unset ALL_PROXY

# 输入/输出重定向

  • 标准输入(stdin)是指令数据的输入,文件描述符为 0,使用 < 或者 <<,默认是键盘
  • 标准输出(stdout)是指令执行成功返回的结果,文件描述符为 1,使用>或者>`,默认由屏幕显示
  • 标准错误输出(stderr)是指令执行失败返回的错误信息,文件描述符为 2,使用 2> 或者 2>>,默认是屏幕

# 重定向输入/输出

  • <:指定输入的数据媒介来源
  • 1>:将 stdout 覆盖输出到指定的媒介
  • 1>>:将 stdout 追加到指定的媒介
  • 2>:将 stderr 覆盖输出到指定的媒介
  • 2>>:将 stderr 追加到指定的媒介
  • 2>&1:将 stderr 重定向到 stdout(>后面的 &,表示重定向的目标不是一个文件,而是一个文件描述符)
  • command < file:将 stdin 重定向到 file
  • command > file:将 stdout 重定向到 file
  • command 2 > file:将 stderr 重定向到 file
  • command >> file 2>&1:将 stdout 和 stderr 合并后以追加的方式重定向到 file

# 管道命令

  • 命令通过管道符 | 连接,用于将当前命令的输出结果作为下一个命令的参数
  • 能够接收标准输入(stdin),如 tail/more/grep 等
  • 能够接收来自于前一个指令的数据成为 stdin 进行处理
  • grep 指令:grep [-cinvwE] [-A<显示列数>][-B<显示列数>][-C<显示列数>][范本样式][文件或目录...],查找文件里符合条件的字符串,支持正则(-c 计算字符出现的个数;-i 忽略大小写进行查找;-n 输出行号;-v 显示不包含匹配文本的所有行;-w 只显示全字符合的列;-E 将样式为延伸的正则表达式来使用,执行效果与 "egrep" 相似)
  • sort 指令:sort [-fbknrtu] filename,将文本文件内容加以排序,文本文件以行为单位,(-f 忽略大小写;-b 忽略最前面的空格;-M 以月份英文名字排序;-n 使用数值的大小排序;-r 逆向排序;-t 分隔符,默认是 tab 分割;-k 以第几列来排序)
  • wc 指令:wc [-lwm] filename,统计(-l 统计行;-w 统计词;-m 统计字符)

# 其它常用命令

# curl (opens new window)

  • 利用 URL 规则在命令行下工作的文件传输工具,常用选项:
    -A:指定客户端的用户代理标头
    -v, --verbose:显示详细信息,包含请求和响应的首部
    -o xxx:把输出写到 xxx 文件中
    -O:把输出写到文件中,保留远程文件的文件名
    -C:断点续转
    -x:ip:port 使用 HTTP 代理
    -c cookiec.txt:操作结束后把 cookie 写入到文件中
    -b cookiec.txt:cookie 字符串或文件读取位置
    -I:只显示请求头信息
    -X <command>:指定请求方式,如 -X POST
    -G:以 get 方式来发送数据
    -d <data>:用于发送 post 请求的数据体
    -H <header:value>:自定义头信息传递给服务器
    -F <name=content>:模拟 http 表单提交数据
    -k:允许不使用证书到 SSL 站点
    -s:静默模式,不输出任何东西
    -S:显示错误
    -L:跟随重定向
    -u, --user <user:password>:指定用于服务器验证的用户名和密码
curl myip.ipip.net
curl -v -H "Content-Type:application/json" -H "X-Forwarded-For:127.0.0.1" -d '{"id":"123"}' http://localhost:8080/search
# GET 请求(省略 -G,会发出一个 POST 请求)
curl -G -d "name=value&name2=value2" http://www.baidu.com
# POST 请求
curl -d "name=value&name2=value2" http://www.baidu.com
1
2
3
4
5
6

# wget

  • 用来从指定的 URL 下载文件,为单线程下载,常用选项:
    -O 文件名:以不同的文件名保存,wget -O bench.sh http://bench.sh
    -c:继续执行上次终端的任务
    -q:不显示指令执行过程
    -b:进行后台的方式运行
    -v:显示详细执行过程
    -i filelist.txt:从指定文件获取要下载的 URL 地址
    --spider:测试下载链接
# 下载父目录下的整个子目录
wget -r --level=0 -E --ignore-length -x -k -p -erobots=off -np -N http://www.remote.com/remote/presentation/dir

# 下载一个目录下的所有文件
wget -c -r -np -nH -R index.html http://url/including/files/you/want/to/download/

各个参数的含义:
-c:断点续传
-r:遍历所有子目录
-np:递归下载时不搜索上层目录
-nH:不创建主机目录
-R index.html:不下载 index.html 文件
1
2
3
4
5
6
7
8
9
10
11
12

# mwget

  • 多线程 wget 下载工具
# 安装
wget http://jaist.dl.sourceforge.net/project/kmphpfm/mwget/0.1/mwget_0.1.0.orig.tar.bz2
yum install bzip2 gcc-c++ openssl-devel intltool -y
bzip2 -d mwget_0.1.0.orig.tar.bz2
tar -xvf mwget_0.1.0.orig.tar
cd mwget_0.1.0.orig
./configure
make
make install
1
2
3
4
5
6
7
8
9

# xargs

  • somecommand | xargs -item command
  • xargs 是给命令传递参数的一个过滤器(捕获一个命令的输出,然后传递给另外一个命令),也是组合多个命令的一个工具
  • xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据
  • xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行
  • xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代

ps、grep、kill 联合使用杀掉进程:ps -ef | grep spring-boot-demo.jar | grep -v grep | awk '{print $2}'| xargs kill -15

#!/bin/bash
APP_NAME=spring-boot-demo
pid=`ps -ef | grep ${APP_NAME}.jar | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
  then
    kill -15 $pid
fi
sleep 3
echo "==== starting ${APP_NAME} application ===="
cd /home/springboot
nohup java -jar -Dfile.encoding=UTF-8 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Dspring.profiles.active=prod ${APP_NAME}.jar >> app.log 2>&1 &
sleep 5
echo "${APP_NAME} application started."

# nohup COMMAND &:nohup 不挂断地运行,& 在后台运行
# -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005:远程调试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#!Shebang (opens new window)(也称为 Hashbang),用于指定脚本的解释器

#!/bin/bash,直接指出所需命令解释器的位置
#!/usr/bin/env bash,在 $PATH 中查找名为 bash 的可执行文件,env 命令用于显示系统中已存在的环境变量,以及在定义的环境中执行指令

# 软件包管理器

  • 安装程序的方式:

    • 通用二进制格式:直接解压压缩文件就可以使用
    • 软件包管理器:如 rpm
    • 软件包管理器的前端工具:如 yum
    • 源代码编译
  • 软件包的组成部分:

    • 二进制程序,位于 /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin 等目录中
    • 库文件,位于 /lib, /usr/lib, /usr/local/lib 等目录中,Linux 中库文件以 .so(动态链接库)或 .a(静态链接库)作为文件后缀名
    • 配置文件,位于 /etc 目录中
    • 帮助文件:手册,README, INSTALL (/usr/share/doc/)

# 后端工具(rpm、dpt)

  • rpm(RPM Package Manager)主要用于安装、升级、卸载、查询、校验和数据库管理
  • dpt(Debian Packet Tool)
  • rpm:安装,-ivh(显示安装进度和相关信息),--nodeps(安装时不检查依赖关系),--force(强制安装)
  • rpm -q 包名(不要有后缀名):查询
  • rpm -qa:查询所有的安装的包,| grep pattern(搜索)
  • rpm -Uvh 包名:更新
  • rpm -e:卸载,-nodeps(忽略依赖关系)

# 前端管理工具:yum

  • Yum(全称 Yellow Dog Updater)是一个在 Fedora 和 RedHat 以及 CentOS 中的 Shell 前端软件包管理器
  • 基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包
  • 本地配置:/etc/yum.repos.d/ 目录下的 *.repo 文件

# 常用命令

  • yum-config-manager:用于管理软件仓库,可以调整 yum 的主要配置参数,启动或关闭指定软件源,删除已有软件仓库等,--add-repo=ADDREPO、--enable、--disable、--help
  • yum repolist:查看当前能够使用的 yum 仓库列表,https://opsx.alibaba.com/mirror
  • yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]:清空本地 yum 的缓存
  • yum makecache:重新生成缓存
  • yum upgrade –y:更新 yum 源软件包和内核
  • yum info 包名:显示软件包的摘要信息
  • yum install 包名或rpm包路径 -y:安装
  • yum list | grep 包名:查看仓库中的软件包
  • yum list installed | grep 包名:查看已安装的软件
  • yum list updates:查看所有可更新的包
  • yum update 包1 包2 ... 包n -y:更新
  • yum remove 包1 包2 ... 包n -y:卸载
# 安装 Git
yum -y install git-core

# 使用 nvm 安装 Node.js
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | sh
# wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | sh
nvm install node

# 使用 yum 安装 Node.js
curl -sL https://rpm.nodesource.com/setup_10.x | bash -
yum install -y nodejs

# 安装 ntpdate 服务
yum install -y ntpdate
# 同步阿里云北京时间
ntpdate ntp1.aliyun.com
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# yum 的卸载与安装

  1. 卸载 yum:rpm -aq|grep yum|xargs rpm -e --nodeps

  2. 下载 yum 相关安装包

    wget http://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-3.4.3-168.el7.centos.noarch.rpm
    wget http://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
    wget http://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch.rpm
    # wget http://mirrors.aliyun.com/centos/7/os/x86_64/Packages/python-iniparse-0.4-9.el7.noarch.rpm
    
    1
    2
    3
    4
  3. 安装 yum 包:rpm -ivh *.rpm

  4. 配置 yum (opens new window)

    • 备份:mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    • 下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/
      wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
      curl -o /etc/yum.repos.d/CentOS-Base.repo https://qst123.oss-cn-beijing.aliyuncs.com/SETUP/repo/CentOS-Base.repo(阿里云内网)
    • 生成缓存:yum makecache,运行时如果提示 HTTP Error 404,需要将 repo 文件中的 baseurl 中的 $releasever 替换成 7
    • 非阿里云 ECS 用户会出现 Couldn't resolve host 'mirrors.cloud.aliyuncs.com' 信息,不影响使用。用户也可自行修改相关配置:sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
  5. 安装 epel (opens new window)

    • EPEL (Extra Packages for Enterprise Linux),是由 Fedora Special Interest Group 维护的 Enterprise Linux(RHEL、CentOS)中经常用到的包。
    yum install -y epel-release
    mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
    curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    curl -o /etc/yum.repos.d/epel.repo https://qst123.oss-cn-beijing.aliyuncs.com/SETUP/repo/epel.repo # 阿里云内网
    yum clean all
    yum makecache
    
    1
    2
    3
    4
    5
    6

# Linux 应用

# JDK 的安装

方法一:用 yum 安装 JDK

  • yum list java*
  • yum -y install java-1.8.0-openjdk-devel.x86_64

默认的安装目录是 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64

方法二:手动解压 JDK 压缩包,然后设置环境变量

  1. 检查是否安装 jdk:rpm -qa | grep jdk 或 yum list installed | grep jdk
    如果有就先卸载:rpm -e --nodeps xxxx

  2. 上传 xxxxx.tar.gz 压缩文件到 /usr/local/soft

  3. 解压:tar -xzvf xxxxx.tar.gz

  4. 重命名:mv jdk1.8.0_291 jdk1.8

  5. 配置环境变量 /etc/profile

    • 先备份文件:cp /etc/profile /etc/profile.bak

    • 编辑 profile 文件,在最后添加内容

      JAVA_HOME=/usr/local/soft/jdk1.8
      PATH=$PATH:$JAVA_HOME/bin
      export JAVA_HOME PATH
      
      1
      2
      3
    • 重启系统或者重新加载配置文件(只对当前的终端有效):source /etc/profile

# Tomcat 的安装

  1. 解压文件:tar -xzvf xxxxx
  2. 移动到推荐的目录 /usr/local/:mv tomcatxxx /usr/local/soft/tomcat8
  3. 启动 Tomcat:进入 bin 目录,运行 bash startup.sh 或者 ./startup.sh
  4. 检查是否启动成功,查看 log 日志:tail -100f catalina.out 或 grep Exception -n -C 5 catalina.out
  5. 本地浏览器访问:http://localhost:8080 外面 ip 地址访问:http://192.168.xx.xx:8080
  • 如果外面访问不了,则需要配置防火墙文件,添加 8080 端口

# MySQL 的安装

  1. 检查是否安装 MySQL 相关:rpm -qa | grep mysql 或者 yum list installed |grep mysql
    如果有就先卸载:rpm -e --nodeps xxx 或者 yum -y remove xxxxx
    CentOS 7 需先卸载 mariadb
  2. 下载安装文件 common、libs、client、server(下载地址 MySQL Community Server (opens new window)),安装:rpm -ivh mysql*.rpm
  3. 检查安装结果:rpm -qa | grep mysql 或 mysqladmin -V
  4. 启动 MySQL 服务:service mysql start
  5. 连接 MySQL,设置远程登录用户
    mysql> grant all privileges on *.* to 'root'@'%' identified by 'admin' with grant option; -- 远程用户授权  
    mysql> flush privileges; -- 刷新缓存,重载授权表
    
    1
    2
  6. 重启 MySQL 服务器:service mysql restart
  7. 设置防火墙开放 3306 端口
  8. 通过客户端连接,删除多余的客户(只保留 root@%)
    cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
  • 注意:在 Linux 系统中,MySQL 对于表是默认区分大小写的,show variables like "%case%";
    可在配置文件中 vi /etc/my.cnf 添加参数
    [mysqld] lower_case_table_names=1

# Crontab 定时任务

  1. 检查是否安装 crontab:yum list installed | grep crontabs
  2. 查看 yum 仓库是否有该安装包:yum list | grep crontabs
  3. 安装 crontab:yum -y install crontabs.noarch
  4. 编辑定时任务:crontab -e
    */1 * * * * /home/dbbackup/dbbackup.sh
  5. 查看定时任务:crontab -l
  6. 重启 Linux 或者处理服务
  • 服务操作说明:
    /sbin/service crond start:启动服务
    /sbin/service crond stop:关闭服务
    /sbin/service crond restart:重启服务
    /sbin/service crond reload:重新载入配置

  • 查看 crontab 服务状态:systemctl status crond

  • 注意 sh 脚本要有 x 执行的权限:chmod +x filename

  • 数据库定时备份
    每天晚上凌晨 2 点 30 分开始对 demo 数据库进行数据备份到 /backup/ 目录下,并且只保留 30 天的备份数据

1. 编写 demobackup.sh 脚本文件
#!/bin/bash
find /root/backup/ -mtime +30 -name '*.sql' -exec rm -fr '{}' \;
DATE=$(date +%Y%m%d-%H:%M)
mysqldump -uroot -padmin demo>/root/backup/demo$DATE.sql

2. 定时运行脚本文件
crontab -e
30 2 * * * /root/backup/demobackup.sh
1
2
3
4
5
6
7
8
9

# Supervisor 进程守护监控 (opens new window)

  • Supervisor 是用 Python 开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台 daemon,并监控进程状态,异常退出时能自动重启和报警

  • 通过 fork/exec 的方式把这些被管理的进程当作 Supervisor 的子进程来启动

  • 安装:yum install supervisor

  • Supervisor 配置文件:/etc/supervisord.conf

  • 常用命令
    echo_supervisord_conf:查看 Supervisor 配置
    supervisorctl help
    supervisorctl reload:载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程(注:start、restart、stop 都不会载入最新的配置文件)
    supervisorctl update:根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
    supervisorctl stop program_name:停止某一个进程,program_name 为 [program:x] 里的 x
    supervisorctl start program_name:启动某个进程
    supervisorctl restart program_name:重启某个进程
    supervisorctl stop groupworker1:结束所有属于名为 groupworker1 这个分组的进程(start、restart 同理)
    supervisorctl stop groupworker1:name1:结束 groupworker1:name1 这个进程(start、restart 同理)
    supervisorctl stop all:停止全部进程
    supervisorctl status all:查看状态

# lrzsz 交互式文件传输

  • 安装:yum -y install lrzsz
  • 将选定的文件发送(send)到本地:sz filename
  • 从本地选择文件上传到服务器(receive):rz,或者直接拖拽要上传的文件
  • 需使用支持 Zmodem 协议 的 telnet/ssh 客户端;lrzsz 只适合传输小文件

# glances 监控

  • 安装:yum -y install glances 或 pip install glances

  • 常用的快捷键

    m : 按内存占用排序进程
    p : 按进程名称排序进程
    c : 按 CPU 占用率排序进程
    i : 按 I/O 频率排序进程
    a : 自动排序进程
    d : 显示/隐藏磁盘 I/O 统计信息
    f : 显示/隐藏文件系统统计信息
    s : 显示/隐藏传感器统计信息
    y : 显示/隐藏硬盘温度统计信息
    l : 显示/隐藏日志
    n : 显示/隐藏网络统计信息
    x : 删除警告和严重日志
    h : 显示/隐藏帮助界面
    q : 退出
    w : 删除警告记录
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

# Cockpit (opens new window) 可视化管理工具

# Axel 多线程下载

  • 安装:yum -y install axel

# ab 压测 (opens new window)

  • Apache Bench,Apache 的 Web 服务器的性能测试工具
  • 创建多个并发访问线程,模拟多个访问者同时对某一 URL 地址进行访问
  • 安装:yum -y install httpd-tools
  • 常用选项:
    -n:请求数
    -c:一次向服务器发出请求数(并发数)
    -k:启用 HTTP KeepAlive 功能,即在一个 HTTP 会话中执行多个请求(默认不启用)
  • ab -c 10 -n 400 https://www.baidu.com/

# wrk 压测 (opens new window)

  • a HTTP benchmarking tool
  • 选项:
    -c, --connections <N> 跟服务器建立并保持的 TCP 连接数量
    -d, --duration <T> 压测持续时间
    -t, --threads <N> 使用多少个线程进行压测
    -s, --script <S> 指定 Lua 脚本路径
    -H, --header <H> 为每一个 HTTP 请求添加 HTTP 头
    --latency 在压测结束后,打印延迟统计信息
    --timeout <T> 超时时间
    -v, --version 打印正在使用的 wrk 的详细版本信息
    其中,<N> 代表数字参数,支持国际单位 (1k, 1M, 1G),<T> 代表时间参数,支持时间单位 (2s, 2m, 2h)
git clone https://github.com/wg/wrk.git wrk
cd wrk
make
# 把生成的 wrk 移到一个 PATH 目录下,例如
cp wrk /usr/local/bin && chmod +x /usr/local/bin/wrk

# 使用 10 个线程建立 400 个 http 连接,持续进行 30s 压测
wrk -t 10 -c 400 -d 30s http://127.0.0.1:8080/index.html
1
2
3
4
5
6
7
8
Updated at: 2023-11-27 00:47:11